package cn.cdeden.knowledge.service;

import cn.cdeden.common.core.utils.page.TableDataInfo;
import cn.cdeden.knowledge.domain.PersonalFilesTree;
import cn.cdeden.knowledge.domain.TreeDownloadFiles;
import cn.cdeden.knowledge.domain.dto.*;
import cn.cdeden.knowledge.domain.vo.PersonalFilesTreeVo;
import cn.cdeden.system.api.model.LoginUser;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import io.undertow.util.BadRequestException;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Set;

public interface PersonalFilesTreeService extends IService<PersonalFilesTree>{

    /**
     * @Description  // 查询个人树结构化数据  可以通过 nodeType 来判断只查询 出那个类型的 数据 是 表单的 还是文件夹  还是文件的
     **/
    PersonalFilesTreeVo selectTree(PersonalFilesTreeParam query) throws BadRequestException;



    PersonalFilesTree getPersonalFilesTree(String parentId, String id);

    /**
     * @Description // 个人树是否有树头
     **/
    PersonalFilesTree createTree(String id);



    /**
     * @Description // 整理数据新格式数据
     **/
    void organizeData(PersonalFilesTree filesTree);


    //    修改上级的文件夹大小
    boolean upDateFolderSize(PersonalFilesTree filesTree,String type);


    String superiorFolderCheck(PersonalFilesTree filesTree);



    /**
     * @Description  // 查询个人树结构化数据  可以通过 nodeType 来判断只查询 出那个类型的 数据 是 表单的 还是文件夹  还是文件的
     **/
    TableDataInfo<PersonalFilesTreeVo> selectTreePage(PersonalFilesTreeParam query, Pageable pageable);

    /**
     * 创建文件夹
     * @param parentId
     * @param folderName
     * @return
     */
    PersonalFilesTree createFolder(String parentId , String folderName, LoginUser user) throws BadRequestException;



    /**
     * @Description // 判断是否是在自己子文件下
     * @param ids
     * @param parentId
     * @return java.lang.Boolean
     **/
    Boolean JudgmentEmpty(List<String> ids, String parentId);



    /**
     * @Description // 文件夹下的所有文件大小
     * @param ids
     * @return java.lang.Long
     **/
    Long folderCheck(List<String> ids);


    Boolean judgeIsEmpty(String userId, String username,String folderName,String parentId,String type,String suffix);


    Boolean judgeIsEmpty(String id,String userId, String username,String folderName,String parentId,String type,String suffix);



    /**
     * @Description // 修改文件名 需修改 文件夹下级路径修改
     * @param userId
     * @param username
     * @param path
     * @param newPath
     * @param id
     * @return boolean
     **/
    boolean  updatePath(String userId, String username , String path ,String newPath ,String id,boolean b);



    /**
     * @Description // 文件夹 下的全部儿子文件
     * @param ids
     * @return java.util.Set<java.lang.String>
     **/
    Set<String> folderSon(List<String> ids);


    void folderCheck(List<String> ids, Set<String> setId , boolean b);


    /**
     * @Description // 计算空间大小
     * @param userId
     * @return void
     **/
    void calculateSpaceSize(String userId);



    boolean upDateFolderSizeUpDate(PersonalFilesTree filesTree , Long originalSize, Long newSize);

    /**
     * @Description // 高级搜索
     * @param infoDto
     * @param pageable
     * @return com.cdyd.ecm.base.PageInfo<com.cdyd.ecm.modules.FilesTree>
     **/
    TableDataInfo<FilesTree> selectPersonalTreePage(SearchFilesInfoDto infoDto, Pageable pageable);

    IPage<PersonalFilesTree> selectPersonalTreePage(PersonalFilesTreeParam query, String createId, Pageable pageable);



    /**
     * @Description // 查询树
     * @param parentId
     * @return java.util.List<com.cdyd.ecm.file.domain.PersonalFilesTree>
     **/
    List<PersonalFilesTree> selectPersonalTree(String parentId);




    List<PersonalFilesTree> selectPersonalTree(PersonalFilesTreeParam query, String createId);





    /**
     * @Description // 判断是否是自己的文件夹
     * @param nodeId
     * @param userId
     * @param b
     * @return boolean
     **/
    boolean selectByNodeIdIsOwn(List<String> nodeId,String userId,boolean b);




    /**
     * 查询所有子目录
     * @param ids
     * @return
     */
    List<PersonalFilesTree> selectJuniorAll(List<String> ids, String deleteType);



    /**
     * @Description // 文件夹 下的全部儿子文件 是否删除
     * @param ids
     * @param b
     * @return java.util.List<com.cdyd.ecm.domain.TreeDownloadFiles> 返回文件消息
     **/
    List<TreeDownloadFiles> folderSonFiles(List<String> ids, Boolean b);



    /**
     * @Description // 查询文件树
     * @param ids
     * @return java.util.List<com.cdyd.ecm.modules.personal.domain.PersonalFilesTree>
     **/
    List<PersonalFilesTree> selectFilesTree(List<String> ids);


    /**
     * 根据父级id查询父级文件信息
     * @param parentId
     * @return
     */
    PersonalFilesTree selectByParentId(String parentId);


    /**
     * 根据父级id查询所有父级id相同的文件信息
     * @param parentId
     * @return
     */
    List<PersonalFilesTree> selectByParentIdAll(String parentId);


    /**
     * 保存数据
     * @param personalFilesTree
     * @return
     */
    boolean insertOne(PersonalFilesTree personalFilesTree);


    PersonalFilesTree selectById(String moduleId);

    List<PersonalFilesTree> selectByIds(List<String> idList);

    /**
     * @Description // 移动文件 需修改 文件夹下级路径修改
     * @param userId
     * @param username
     * @param path
     * @param newPath
     * @param id
     * @return boolean
     **/
    boolean  updatePathID(String userId, String username , String path,String superiorsIds ,String newPath ,String newSuperiorsIds,String id,boolean b);



//    PersonalFilesTree createFolder(String parentId , String folderName);
    PersonalFilesTree createFolderFilePath(String parentId , String path, LoginUser user);

    PersonalFilesTree createFolderFilePath(LoginUser user , FilesTreeUploadDto uploadDto);

    /**
     * 查询文件夹中的文件是否有重名的
     * @param parentId
     * @param filePath
     * @return
     */
    List<PersonalFilesTree> selectByParentIdFolder(String parentId, String filePath);


    //构建文件id获取文件上级文件夹
    FilesTree selectPersonalSuperiorFolder(String id,String userId,List<String> sort) throws BadRequestException;

    //    查询树id在在第几页数据
    int selectByIdTreePageInfo(String userId ,String treeId,String parentId,Integer size,List<String> sort);

    List<PersonalFilesTree> getAllChildById(Long id);


    /**
     * @Description // 文件获取这个文件下的全部文件
     * @param id
     * @return com.cdyd.ecm.modules.teamDoc.teamToEnt.service.dto.PersonalToEnterpriseDto
     **/
    PersonalToEnterpriseDto assembleTeamToEnterprise(String id);

    void fileToExpertApp(ToExpertAppDto toExpertAppDto) throws BadRequestException;

    void againFileToExpertApp(ToExpertAppDto toExpertAppDto);




}
